<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>openGauss Blog  | openGauss数据库性能调优</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">

    
    <link rel="shortcut icon" href="https://xzx666.gitee.io/lookeng/img/favicon.ico" type="image/x-icon" />
    <link rel="apple-touch-icon" href="https://xzx666.gitee.io/lookeng/img/apple-touch-icon.png" />

    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

    
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
    
    <link rel="stylesheet" href="https://xzx666.gitee.io/lookeng/css/commen.css?t=1607593672000" />
    <link rel="stylesheet" href="https://xzx666.gitee.io/lookeng/css/blog.css?t=1607593672000" />
    <link rel="stylesheet" href="https://xzx666.gitee.io/lookeng/css/mobile.css?t=1607593672000" />
    <link rel="stylesheet" href="https://xzx666.gitee.io/lookeng/css/pagination.css?t=1607593672000">
    
    <script>
      var _hmt = _hmt || [];
      (function() {
        var hm = document.createElement("script");
        hm.src = "https://hm.baidu.com/hm.js?34e9f585f29581007941aa1698181871";
        var s = document.getElementsByTagName("script")[0]; 
        s.parentNode.insertBefore(hm, s);
      })();
    </script>
</head>
<body>
  <script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>
  <script src='//unpkg.com/valine/dist/Valine.min.js'></script>






<div class="container">
    <div class="columns blog-detail">
        <div class="post_detail">
            <div class="is-child box">
                <div class="breadCrumb"><a href="\zh\">博客/</a></div>
                <div class="blog-detail-header">
                    <h1>openGauss数据库性能调优</h1>
                    <div class="blog-detail-prop">
                        <img src="https://xzx666.gitee.io/lookeng/img/icon-date.png">
                        <span class="article_right_date">2020-07-25</span>
                        <img src="https://xzx666.gitee.io/lookeng/img/icon-author.png">
                        <span class="article_right_author">zhijing</span>
                        <img src="https://xzx666.gitee.io/lookeng/img/icon-view.png">
                        <span id="/zh/post/optimize/opengauss-optimize1/" class="leancloud_visitors" data-flag-title="openGauss数据库性能调优">
                            <i class="leancloud-visitors-count"></i>                     
                        </span>
                    </div>
                    <div class="blog-detail-tags">
                        <img src="https://xzx666.gitee.io/lookeng/img/icon-tag.png">
                        
                        <a href="https://xzx666.gitee.io/lookeng/zh/tags/opengauss%E6%95%B0%E6%8D%AE%E5%BA%93%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98">openGauss数据库性能调优</a>
                        
                    </div>
                </div>
                <div class="content blog-content">
                    

<h3 id="概述">概述</h3>

<p>本文描述了openGauss数据库内核基于Taishan服务器，在openEuler操作系统上，为了达到数据库的极致性能，所依赖的关键系统级调优配置。</p>

<p><strong>硬件规格：</strong> <br />
CPU:    Kunpen-920(1620)  ARM aarch64  64核 * 2   <br />
内存: &gt;=512G <br />
磁盘: Nvme SSD * 4(每块大于1TB) <br />
网卡: 1822网卡  万兆网卡 Ethernet controller: Huawei Technologies Co., Ltd. Hi1822 Family (4*25GE) (rev 45)</p>

<p><strong>软件规格：</strong> <br />
操作系统:   openEuler 20.03 (LTS) <br />
数据库: openGauss 1.0.0 <br />
Benchmark: benchmarksql-5.0 <br />
jdk:    jdk1.8.0_212 <br />
ant: apache-ant-1.9.15</p>

<p>文章通过配置BIOS、操作系统、文件系统、网络、绑核，构造TPCC测试数据等几个方面来对数据库进行调优。
- 依赖三方工具 <code>jdk ant benchmark</code>
- linux工具 <code>htop iostat</code></p>

<p>benchmark htop iostat工具的安装使用请参照：<a href="https://xzx666.gitee.io/lookeng/zh/post/optimize/opengauss-tpcc/">benchmark使用</a></p>

<h3 id="bios配置">BIOS配置</h3>

<p>登录服务器管理系统，重启服务器进入BIOS界面，修改BIOS相关配置并重启 (服务器管理系统以实际为准)。</p>

<p><strong>1.机器自检后，会提示启动选项</strong>
<img src="../images/bios1.png" alt="" />
<strong>2.按“Del”键，进入BIOS</strong>
<img src="../images/bios2.png" alt="" />
<strong>3.输入BIOS密码</strong>
<img src="../images/bios3.png" alt="" />
<strong>4.恢复出厂设置</strong></p>

<p>按下“F9”，恢复出厂设置<br />
<em>重要：因为现有的BIOS可能被改动过诸多默认设置，为保险起见，建议首先恢复出厂设置</em></p>

<p><strong>5. 修改相关BIOS设置</strong></p>

<p>修改包括下面三项配置</p>

<pre><code>
# BIOS-&gt;Advanced-&gt;MISC Config，配置Support Smmu为Disabled
# BIOS-&gt;Advanced-&gt;MISC Config，配置CPU Prefetching Configuration为Disabled
# BIOS-&gt;Advanced-&gt;Memory Config，配置Die Interleaving为Disable

</code></pre>

<p><img src="../images/bios4.png" alt="" />
<img src="../images/bios5.png" alt="" /></p>

<p><strong>6. 保存相关BIOS设置，并重启</strong></p>

<p>按“F10”保存并退出，重新启动系统
<img src="../images/bios6.png" alt="" /></p>

<h3 id="操作系统配置">操作系统配置</h3>

<p><strong>1. 优化操作系统相关配置</strong></p>

<p>Irq balance关闭：为避免gaussdb与客户端抢用CPU，导致CPU使用不均衡。
如果htop呈现出部分CPU压力很大，部分CPU很空闲时需要考虑是否关闭了irqbalance。
<img src="../images/os3.png" alt="" /></p>

<pre><code class="language-shell">
service irqbalance stop
echo 0 &gt; /proc/sys/kernel/numa_balancing
echo 'never' &gt; /sys/kernel/mm/transparent_hugepage/enabled
echo 'never' &gt; /sys/kernel/mm/transparent_hugepage/defrag
echo none &gt; /sys/block/nvme*n*/queue/scheduler  ## 针对nvme磁盘io队列调度机制设置

</code></pre>

<h3 id="文件系统配置">文件系统配置</h3>

<p><strong>1. 修改xfs文件系统blocksize为8K</strong></p>

<p><1> 确认nvme盘对应加载点的现有blocksize
下面命令查看当前挂载的nvme盘</p>

<pre><code class="language-shell">
df -h | grep nvme

</code></pre>

<pre><code>/dev/nvme0n1                3.7T  2.6T  1.2T  69% /data1
/dev/nvme1n1                3.7T  1.9T  1.8T  51% /data2
/dev/nvme2n1                3.7T  2.2T  1.6T  59% /data3
/dev/nvme3n1                3.7T  1.4T  2.3T  39% /data4
</code></pre>

<p><code>xfs_info</code>命令可以查看nvme盘的信息</p>

<pre><code class="language-shell">
xfs_info /data1

</code></pre>

<p><img src="../images/fs1.png" alt="" /></p>

<p>上图中block的大小正好为8K, 不需要修改。若不满足8k块大小的要求, 需要重新格式, 格式化前注意数据的备份。</p>

<p><2> 针对需要格式化的磁盘，备份所需的数据</p>

<p>用户注意根据需要，将所需数据备份至其他磁盘或其他机器</p>

<p><3> 重新格式化磁盘，设置block大小8k</p>

<p>以/dev/nvme0n1盘，加载点为/data1为例，相关参考命令如下</p>

<pre><code class="language-shell">
umount /data1
mkfs.xfs -b size=8192 /dev/nvme0n1 -f
mount /dev/nvme0n1 /data1

</code></pre>

<p><4> 再次用<code>xfs_info</code>命令确认blocksize是否修改正确</p>

<h3 id="网络配置">网络配置</h3>

<p><strong>1. 多中断队列设置</strong></p>

<p>针对泰山服务器核数较多的特征，产品需要在服务器端和客户端设置网卡多队列。
当前推荐的配置为：服务器端网卡配置16中断队列，客户端网卡配置48中断队列。</p>

<p>多中断队列设置工具(1822-FW) <br />
Hi1822网卡发布版本可以从如下链接获取，IN500 solution 5.1.0.SPC401及之后正式支持设置多队列：
<a href="https://support.huawei.com/enterprise/zh/intelligent-accelerator-components/in500-solution-pid-23507369/software">https://support.huawei.com/enterprise/zh/intelligent-accelerator-components/in500-solution-pid-23507369/software</a></p>

<p><1> 解压Hi1822-NIC-FW.zip, 进入目录，在root用户下安装hinicadm
<img src="../images/netcf1.1.png" alt="" />
<2> 确定当前连接的物理端口是哪个网卡的，不同硬件平台这个网口和网卡名有差别。以如下示例机器为例，当前使用enp3s0的小网网口，属于hinic0网卡
<img src="../images/netcf1.2.png" alt="" />
<img src="../images/netcf1.3.png" alt="" /></p>

<p><3> 进入config目录， 利用配置工具<code>hinicconfig</code>配置中断队列FW配置文件；</p>

<pre><code>64队列配置文件：std_sh_4x25ge_dpdk_cfg_template0.ini；
16队列配置文件：std_sh_4x25ge_nic_cfg_template0.ini； 
对hinic0卡配置为不同队列数（默认16队列，可以按需要调整）
</code></pre>

<pre><code class="language-shell">
./hinicconfig hinic0 -f std_sh_4x25ge_dpdk_cfg_template0.ini

</code></pre>

<p>重启操作系统生效，输入命令<code>ethtool -l enp3s0</code>查看（比如下图表示修改为32）
<img src="../images/netcf1.4.png" alt="" /></p>

<p>修改combined的值，输入命令<code>ethtool -L enp3s0 combined 48</code>（不同平台，不同应用的优化值可能不同，当前128核平台，服务器端调优值为16，客户端调优值为48）</p>

<p><strong>2. 中断调优</strong></p>

<p>在openGauss数据库满跑的情况下（CPU占比90%以上），CPU成为瓶颈，开启offloading，将网络分片offloading到网卡上</p>

<pre><code class="language-shell">
ethtool –K enp3s0 tso on
ethtool –K enp3s0 lro on
ethtool –K enp3s0 gro on
ethtool –K enp3s0 gso on

</code></pre>

<p>以1620平台为例，网卡中断绑定每个numa node中最后4个core，每个core绑定3个中断。绑核中断脚本如下所示，此脚本将在openGauss安装的时候在gs_preinstall被调用，具体执行步骤请查看产品安装说明书：
<img src="../images/netcf2.1.png" alt="" /></p>

<pre><code class="language-shell">
sh bind_net_irq.sh  16

</code></pre>

<p><strong>3. 网卡固件确认与更新</strong></p>

<blockquote>
<p>确认当前环境的小网网卡固件版本是否为2.5.0.0</p>

<pre><code class="language-shell">
ethtool -i enp3s0

</code></pre>

<pre><code>driver: hinic                                
version: 2.3.2.11                            
firmware-version: 2.5.0.0                    
expansion-rom-version:                       
bus-info: 0000:03:00.0 
</code></pre>
</blockquote>

<p>如果是2.5.0.0，建议更换为2.4.1.0，以获得更佳性能</p>

<blockquote>
<p>网卡固件更新步骤</p>
</blockquote>

<p><1> 上传网卡固件驱动至服务器
Hi1822_nic_prd_1h_4x25G.bin</p>

<p><2> 使用root执行如下命令</p>

<pre><code class="language-shell">
hinicadm updatefw -i &lt;物理网卡设备名&gt; -f &lt;固件文件路径&gt;

</code></pre>

<p>其中，“物理网卡设备名”为网卡在系统中的名称，例如“hinic0”表示第一张网卡，“hinic1”表示第二张网卡，查找方法参见前文“多中断队列设置”。
例如：</p>

<pre><code># hinicadm updatefw -i &lt;物理网卡设备名&gt; -f &lt;固件文件路径&gt;
Please do not remove driver or network device 
Loading... 
[&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;]  [100%] [\] 
Loading firmware image succeed. 
Please reboot OS to take firmware effect.

</code></pre>

<p><3> 重启服务器，再确认小网网卡固件版本成功更新为2.4.1.0</p>

<pre><code class="language-shell">
ethtool -i enp3s0  

</code></pre>

<pre><code>driver: hinic                                
version: 2.3.2.11                            
firmware-version: 2.4.1.0                    
expansion-rom-version:                       
bus-info: 0000:03:00.0 
</code></pre>

<p>确认小网网卡固件版本成功更新成功</p>

<h3 id="数据库服务端及客户端绑核">数据库服务端及客户端绑核</h3>

<p>安装数据库, 具体参考openGauss安装文档。</p>

<p>大概步骤如下：</p>

<p>1、停止数据库</p>

<p>2、修改postgresql.conf参数。</p>

<p>3、以绑核方式启动数据库：
<code>numactl --interleave=all bin/gaussdb  -D ${DATA_DIR} --single_node</code></p>

<p>4、以绑核方式启动benchmark：
<code>numactl -C 0-19,32-51,64-83,96-115 ./runBenchmark.sh props.pg</code> <br />
按照自己的绑核配置和benchmark配置文件执行此命令。这里的绑核参数是在数据库绑核参数的空隙</p>

<p><strong>1. 服务器端绑核设置</strong></p>

<p><1> 业务进程在运行过程中，硬件上报的网络中断会导致频繁的上下文切换，严重影响效率，因此需要将网络中断和业务分开绑定在不同的核上运行，网络中断绑核请查看上一节</p>

<p><2> 当前openGauss中引入了线程池机制，即数据库启动时，线程池将创建指定数目的线程来服务，线程在创建时会进行绑核，因此需要将网卡的绑核信息通过 GUC 参数传入，方便运行期间绑核设置。以128核为例，对应参数如下图
<img src="../images/core1.png" alt="" />
其中线程总数为（cpu总数128 - 处理网络的cpu数目16）* 每个核上线程数（经验值推荐7.25） = (128-16)*7.25 = 812，numa节点数为4，处理中断的核数为16。</p>

<p>如下为辅助分配绑定CPU：</p>

<pre><code class="language-shell">
numactl -C 0-27,32-59,64-91,96-123 gaussdb --single_node -D {DATA_DIR} -p {PORT} &amp;
或者：
numactl --interleave=all gaussdb --single_node -D {DATA_DIR} -p {PORT} &amp;

</code></pre>

<p><strong>2. 服务器端参数设置</strong></p>

<p>postgresql.conf中新增如下参数：
- <code>advance_xlog_file_num = 10</code> <br />
此参数表示后台线程BackgroundWALWriter周期性地提前检测并初始化未来10个XLog文件，避免事务提交时才去执行XLog文件初始化，从而降低事务提交时延。只有在性能压力测试时作用才会体现出来，一般不用配置。默认为0，即不进行提前初始化。
- <code>numa_distribute_mode = 'all'</code> <br />
此参数目前有all和none两个取值。all表示启用NUMA优化，将工作线程和对应的PGPROC、WALInsertlock进行统一分组，分别绑定到对应的NUMA Node下，以减少关键路径上的CPU远端访存。默认取值为none，表示不启用NUMA分布特性。只有在涉及到多个NUMA节点，且远端访存代价明显高于本地访存时使用。当前建议在性能压力测试情况下开启。</p>

<p>thread_pool_attr线程池配置 <br />
<code>thread_pool_attr = '812,4,(cpubind: 0-27,32-59,64-91,96-123)'</code></p>

<p>相关参数：</p>

<pre><code>
max_connections = 4096
allow_concurrent_tuple_update = true
audit_enabled = off
checkpoint_segments = 1024
checkpoint_timeout = 15min
cstore_buffers = 16MB
enable_alarm = off
enable_codegen = false
enable_data_replicate = off
full_page_writes = on
max_files_per_process = 100000
max_prepared_transactions = 2048
shared_buffers = 350GB   
use_workload_manager = off  
wal_buffers = 1GB
work_mem = 1MB
log_min_messages = FATAL
transaction_isolation = 'read committed'
default_transaction_isolation = 'read committed'
synchronous_commit = on
fsync = on
maintenance_work_mem = 2GB
vacuum_cost_limit = 2000
autovacuum = on
autovacuum_mode = vacuum
autovacuum_max_workers = 5
autovacuum_naptime = 20s
autovacuum_vacuum_cost_delay = 10
xloginsert_locks = 48
update_lockwait_timeout = 20min

enable_mergejoin = off
enable_nestloop = off
enable_hashjoin = off
enable_bitmapscan = on
enable_material = off

wal_log_hints = off
log_duration = off
checkpoint_timeout = 15min
autovacuum_vacuum_scale_factor = 0.1
autovacuum_analyze_scale_factor = 0.02
enable_save_datachanged_timestamp = false

log_timezone = 'PRC' 
timezone = 'PRC'              
lc_messages = 'C'			
lc_monetary = 'C'			
lc_numeric = 'C'			
lc_time = 'C'				             

enable_thread_pool = on  
thread_pool_attr = '812,4,(cpubind:0-27,32-59,64-91,96-123)'
enable_double_write = off
enable_incremental_checkpoint = on
enable_opfusion = on
advance_xlog_file_num = 10
numa_distribute_mode = 'all'  

track_activities = off
enable_instr_track_wait = off
enable_instr_rt_percentile = off
track_counts = on
track_sql_count = off
enable_instr_cpu_timer = off

plog_merge_age = 0
session_timeout = 0

enable_instance_metric_persistent = off
enable_logical_io_statistics = off
enable_page_lsn_check = off
enable_user_metric_persistent = off
enable_xlog_prune = off

enable_resource_track = off
instr_unique_sql_count=0
enable_beta_opfusion=on
enable_beta_nestloop_fusion=on

</code></pre>

<p><strong>3. TPCC客户端绑核设置</strong></p>

<p>客户端通过 numactl 将客户端绑定在除网卡外的核上，下图以 128 核环境举例，共80个核用于处理业务逻辑，剩余48个核处理网络中断。</p>

<p><img src="../images/core2.png" alt="" /></p>

<p>对应tpmc程序应该使用为：</p>

<pre><code class="language-shell">
numactl -C 0-19,32-51,64-83,96-115 ./runBenchmark.sh props.pg

</code></pre>

<p>其他核用来处理网络中断</p>

<h3 id="构建tpcc初始数据">构建TPCC初始数据</h3>

<p>benchmark的安装和使用参照文档：<a href="https://xzx666.gitee.io/lookeng/zh/post/optimize/opengauss-tpcc/">benchmark使用</a></p>

<p><strong>1. 修改benchmark配置</strong></p>

<p>复制props.pg并重命名为props.opengauss.1000w，编辑该文件，将如下配置覆盖到文件里面</p>

<pre><code class="language-shell">
cp props.pg props.opengauss.1000w
vim props.opengauss.1000w

</code></pre>

<pre><code>
db=postgres
driver=org.postgresql.Driver
// 修改连接字符串, 包含ip, 端口号, 数据库
conn=jdbc:postgresql://ip:port/tpcc1000?prepareThreshold=1&amp;batchMode=on&amp;fetchsize=10
// 设置数据库登录用户和密码
user=user
password=******

warehouses=1000
loadWorkers=200

// 设置最大并发数量, 跟服务端最大work数对应
terminals=812
//To run specified transactions per terminal- runMins must equal zero
runTxnsPerTerminal=0
//To run for specified minutes- runTxnsPerTerminal must equal zero
runMins=5
//Number of total transactions per minute
limitTxnsPerMin=0

//Set to true to run in 4.x compatible mode. Set to false to use the
//entire configured database evenly.
terminalWarehouseFixed=false

//The following five values must add up to 100
//The default percentages of 45, 43, 4, 4 &amp; 4 match the TPC-C spec
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4

// Directory name to create for collecting detailed result data.
// Comment this out to suppress.
resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
osCollectorScript=./misc/os_collector_linux.py
osCollectorInterval=1
// 收集OS负载信息
//osCollectorSSHAddr=osuer@10.44.133.78
//osCollectorDevices=net_enp3s0 blk_nvme0n1 blk_nvme1n1 blk_nvme2n1 blk_nvme3n1

</code></pre>

<p><strong>2. TPCC导入数据前准备</strong></p>

<p><1> 替换tableCreats.sql文件</p>

<p>下载文件tableCreates.sql (<a href="https://blog.opengauss.org/zh/post/optimize/images/tableCreates.sql)。">https://blog.opengauss.org/zh/post/optimize/images/tableCreates.sql)。</a>
使用该文件替换benchmarkSQL中路径 benchmarksql-5.0/run/sql.common/ 下的对应文件。<br />
该文件主要做了如下修改：<br />
1.增加了两个表空间</p>

<pre><code class="language-sql">CREATE TABLESPACE example2 relative location 'tablespace2';
CREATE TABLESPACE example3 relative location 'tablespace3';
</code></pre>

<p>2.删除序列<code>bmsql_hist_id_seq</code></p>

<p>3.给每一个表增加FACTOR属性</p>

<pre><code class="language-sql">create table bmsql_stock (
  s_w_id       integer       not null,
  .....
  s_dist_10    char(24)
) WITH (FILLFACTOR=80) tablespace example3;
</code></pre>

<p><2> 修改索引indexCreates.sql</p>

<p>修改run/sql.common/indexCreates.sql文件
<img src="../images/index1.png" alt="" /> <br />
修改上图中红框中的内容如下： <br />
<img src="../images/index2.png" alt="" /></p>

<p>在该文件中添加下图中红色内容，可以在benchmark自动生成数据的时候自动生成到不同的数据表空间，如果未添加可以在benchmark生成数据之后再数据库端修改。用于分盘。
<img src="../images/index3.png" alt="" /></p>

<p><3> 修改runDatabaseBuild.sh文件
修改下图内容可避免生产数据时候的外键不支持错误
<img src="../images/index4.png" alt="" /></p>

<p><strong>3. 导入数据</strong></p>

<p>运行runDatabaseBuild.sh导入数据</p>

<p><strong>4. 数据备份</strong></p>

<p>为了方便多次测试, 减少导数据的时间, 可以将导好的数据备份, 一种常用的做法是: 停止数据库, 将整个数据目录做一次拷贝。 恢复时参考脚本如下</p>

<pre><code class="language-shell">
#!/bin/bash
rm -rf /ssd/omm108/gaussdata
rm -rf /usr1/omm108dir/tablespace2
rm -rf /usr2/omm108dir/tablespace3
rm -rf /usr3/omm108dir/pg_xlog
cp -rf /ssd/omm108/gaussdatabf/gaussdata /ssd/omm108/ &amp;
job0=$!
cp -rf /usr1/omm108dir/tablespace2bf/tablespace2 /usr1/omm108dir/ &amp;
job1=$!
cp -rf /usr2/omm108dir/tablespace3bf/tablespace3 /usr2/omm108dir/ &amp;
job2=$!
cp -rf /usr3/omm108dir/pg_xlogbf/pg_xlog /usr3/omm108dir/ &amp;
job3=$!
wait $job1 $job2 $job3 $job0

</code></pre>

<p><strong>5. 数据分盘</strong></p>

<p>在性能测试过程中, 为了增加IO的吞吐量, 需要将数据分散到不同的存储介质上。
由于我们机器上有4块NVME盘, 可以将数据分散到不同的盘上。 我们主要将pg_xlog, tablespace2, tablespace3这三个目录放置在其他3个NVME盘上, 并在原有的位置给出指向真实位置的软连接. pg_xlog位于数据库目录下, tablespace2, tablespace3分别位于数据库目录pg_location下。 对tablespace2分盘的示例命令如下：</p>

<pre><code class="language-shell">
mv $DATA_DIR/pg_location/tablespace2 $TABSPACE2_DIR/tablespace2
cd $DATA_DIR/pg_location/
ln -svf $TABSPACE2_DIR/tablespace2 ./

</code></pre>

<p><strong>6. 运行TPCC程序</strong></p>

<pre><code class="language-shell">
numactl –C 0-19,32-51,64-83,96-115 ./runBenchmark.sh props.opengauss.1000w

</code></pre>

<p><strong>7. 性能监控</strong></p>

<p>使用<code>htop</code>监控数据库服务端和tpcc客户端CPU利用情况, 极限性能测试情况下, 各个业务CPU的占用率都非常高(&gt; 90%), 若有CPU占用率没有达标, 可能是绑核方式不对, 需要进行调整
<img src="../images/monitor.png" alt="" />
上图中黄线框中的是处理网络中断的CPU</p>

<p><strong>8. 调优后的监控状态</strong></p>

<p>经过调优后的htop状态呈现这种状态是比较可靠的状态
<img src="../images/htop1.png" alt="" /></p>

<p>数据库调优是一个繁琐的工作，需要不断去修改配置，运行TPCC，反复去调试以达到最优性能配置。</p>

<p><strong>TPCC运行结果：</strong>
<img src="../images/150wtpmc.png" alt="" /></p>

                </div>
            </div>
            <div class="box" style="margin-top:15px;">
                <div style="font-size:14px;color:gray"><strong>【免责声明】</strong>本文仅代表作者本人观点，与本网站无关。本网站对文中陈述、观点判断保持中立，不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文仅供读者参考，由此产生的所有法律责任均由读者本人承担。</div>
            </div>
            <div class="post-comment">
                
                  
  <link rel="stylesheet" href="https://xzx666.gitee.io/lookeng/css/custom.css" />
  <div id="vcomments" lang="zh-cn" mess="说点什么吧..."></div>

  <script type="text/javascript">
    const placeholder = document.getElementById("vcomments").getAttribute("mess"),
          lang = document.getElementById("vcomments").getAttribute("lang");
    const  langs = lang == "zh-cn" ? "zh-cn" : "en";
    new Valine({
        el: '#vcomments' ,
        appId: '6wfgavgIRqmpC3hjHqQVtFWF-gzGzoHsz',
        appKey: 'QRqrBDBB0p0YhrGe9IJ169ip',
        avatar:'mm', 
        placeholder: placeholder,
        visitor: true,
		    meta: ['nick','mail','link'],
        lang: langs
    });
  </script>
            </div>
        </div>
    </div>
</div>
<script>
    $(function (){
        var query = new AV.Query('Counter');
        query.equalTo('url', decodeURIComponent('\/zh\/post\/optimize\/opengauss-optimize1\/'));
        query.find().then(function (data) {
            if(data.length && (data[0].attributes.author === 'openGauss')){
                var counter = AV.Object.createWithoutData('Counter', data[0].id);
                counter.set('author', 'zhijing');
                counter.save();
            }
        })
    })
</script>







<input id="iframeUrl" type="text" style="display: none;" value=https://xzx666.gitee.io/>




<script defer src="https://xzx666.gitee.io/lookengjs/all.js"></script>
<script src="https://xzx666.gitee.io/lookengjs/flexible.js"></script>
<script>
  const hash = window.location.search,
        pageurl = window.location.href;
  var langss = document.querySelector("html").lang === "zh-cn" ? "zh" : "en";
  console.log("hash:",hash,"pageurl:",pageurl,"ttr",pageurl.split(langss + "/")[1])

  if(!document.getElementById("vcomments")) {
    new Valine({
        appId: '6wfgavgIRqmpC3hjHqQVtFWF-gzGzoHsz',
        appKey: 'QRqrBDBB0p0YhrGe9IJ169ip',
        avatar:'mm',
        visitor: true,
		    meta: ['nick','mail','link']
    });
  }
 
  
    


    const url = document.getElementById("iframeUrl").value;

    function observe (el, options, callback) {
      var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver
      var observer = new MutationObserver(callback)
      observer.observe(el, options)
    }

    var options = {
        childList: true,
        subtree: true,
        characterData: true
      }
    observe(document.body, options, (records, instance) => {
    const height = document.body.scrollHeight;
    parent.postMessage(height,url);
    })
    if(pageurl.split(langss + "/")[1]) parent.postMessage(pageurl.split(langss + "/")[1],url);
    

    if(document.querySelector("#notFound")) parent.postMessage("我404了",url);

</script>
</body>
</html>
